package com.easylinkin.linkappapi.alarm.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.easylinkin.linkappapi.alarm.entity.*;
import com.easylinkin.linkappapi.alarm.vo.AlarmDeviceVo;
import com.easylinkin.linkappapi.gzmmonitor.vo.GzmAlarmDayVO;
import com.easylinkin.linkappapi.gzmmonitor.vo.GzmAlarmVO;
import com.easylinkin.linkappapi.machinery.vo.MachineryWarnGroupTypeVO;
import com.easylinkin.linkappapi.machinery.vo.ProjectWarnStatsticsVO;
import com.easylinkin.linkappapi.openapi.dto.BigScreenStatisticDTO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author Tongjie
 * @since 2020-04-25
 */
public interface AlarmMapper extends BaseMapper<Alarm> {

    /**
     * 查询告警信息
     *
     * @param page      分页参数
     * @param alarm     告警
     * @param spacesIds 空间ids
     * @return 查询结果
     */
    IPage<Alarm> getAlarms(Page page, @Param("alarm") Alarm alarm, @Param("spacesIds") List<String> spacesIds);

    /**
     * 获取最近20分钟的告警数据
     *
     * @param alarm           告警查询条件
     * @param spacesIds       空间ids
     * @param twentyMinutesAgo 20分钟前的时间
     * @return 告警列表
     */
    List<Alarm> getRecentAlarms(@Param("alarm") Alarm alarm, @Param("spacesIds") List<String> spacesIds, @Param("twentyMinutesAgo") Date twentyMinutesAgo);


    /**
     * 查询告警信息
     *
     * @param page  分页参数
     * @param alarm 告警
     * @return 查询结果
     */
    IPage<Alarm> getAlarmsGlobal(Page page, @Param("alarm") Alarm alarm);


    List<AlarmVo> getAlarmVos(@Param("alarm") Alarm alarm, @Param("spacesIds") List<String> spacesIds);

    /**
     * 查询最近的一条记录
     */
    Alarm getLatestAlarmByAlarm(@Param("alarm") Alarm alarm);

    /**
     * 锁住最新的一条记录
     */
//    void lockLatestAlarmByAlarm(@Param("alarm") Alarm alarm);


    /**
     * 查询详情
     */
    Alarm getDetail(@Param("alarm") Alarm alarm);

    /**
     * 查看详情 v2  小程序
     */
    Alarm getDetail2(@Param("alarm") Alarm alarm);

    List<Map> getAlarmStatisticsByRule(@Param("alarm") Alarm alarm);

    List<AlarmStatistic> getAlarmStatisticsByStatus(@Param("alarm") Alarm alarm, @Param("tenantId") String tenantId, @Param("spacesIds") List<String> spacesIds);

    /**
     * 荆州油烟要求只统计 当日产生的维度统计
     * * 近七天告警已/未处理统计整合
     *
     * @param alarm
     * @param tenantId
     * @param spacesIds
     * @return
     */
    List<AlarmStatistic> getAlarmStatisticsByStatus2(@Param("alarm") Alarm alarm, @Param("tenantId") String tenantId, @Param("spacesIds") List<String> spacesIds);


    /**
     * 统计设备告警
     */
    List<AlarmInfo> getAlarmStatisticsAudit(Alarm alarm);

    void insertAlarmInfo(AlarmInfo alarmInfo);

    void updateAlarmInfo(AlarmInfo alarmInfo);

    List<AlarmInfo> selectAlarmInfoList(@Param("alarmInfo") AlarmInfo alarmInfo, @Param("tenantId") String tenantId, @Param("spacesIds") List<String> spacesIds);

    IPage<Alarm> getAlarmPageByAsset(Page page, @Param("alarm") Alarm alarm, @Param("deviceIds") List<String> deviceIds);

    /**
     * 根据设备code 查询未处理的告警的条数
     *
     * @param deviceCode 设备code
     * @return 告警条数
     */
    int countAlarmByDeviceCodeAndStatus(@Param("deviceCode") String deviceCode, @Param("status") Integer status);

    /**
     * lqh
     * 根据区域路径统计各个告警总数
     *
     * @return
     */
    List<AlarmCountByArea> countAlarmByAreaPathAndStatus(@Param("alarm") Alarm alarm);

    /**
     * 顺丰环境监测大屏，预计分析sql
     *
     * @param alarm
     * @return
     */
    List<AlarmCountByArea> countAlarmByStatusAndAreaIds(@Param("alarm") Alarm alarm);

    IPage<Alarm> getDistributionAlarmPage(@Param("page") Page page, @Param("alarm") Alarm alarm, @Param("spacesIds") List<String> spacesIds);

    /**
     * @param userIds 查找用户的范围
     * @param alarm   告警信息
     * @return 查询 告警 alarm 可以被哪些用户可见
     */
    Set<String> selectVisibleAlarmCommonUserIds(@Param("userIds") Set<String> userIds, @Param("alarm") Alarm alarm);

    Alarm getNoticeInfoAlarm(@Param("id") String id);

    IPage<Alarm> getAlarmsForBigScreenPageGlobal(Page page, @Param("deviceCodes") List<String> deviceCodes, @Param("tenantId") String tenantId);

    /**
     * 统计
     *
     * @param deviceCodes
     * @param ruleEngineIds
     * @param startTime
     * @param endTime
     * @param tenantId
     * @return
     */
    int countAlarmByDeviceCodesGlobal(@Param("deviceCodes") List<String> deviceCodes,
        @Param("ruleEngineIds") List<String> ruleEngineIds,
        @Param("startTime") Date startTime,
        @Param("endTime") Date endTime,
        @Param("tenantId") String tenantId);

    /**
     * 根据条件统计数量按规则分组
     *
     * @param alarmDeviceVo 条件vo
     * @return 统计数量按规则分组
     */
    List<Map<String, Object>> countAlarmByRule(AlarmDeviceVo alarmDeviceVo);

    /**
     * 根据条件统计数量按日分组
     *
     * @param alarmDeviceVo 条件vo
     * @return 统计数量按日分组
     */
    List<Map<String, Object>> countAlarmByDay(AlarmDeviceVo alarmDeviceVo);

    /**
     * 根据条件统计报警数量，按类型分组
     *
     * @param alarmDeviceVo 报警条件vo
     * @return 统计报警数量
     */
    List<Map<String, Object>> countAlarmByRuleAndParamGlobal(AlarmDeviceVo alarmDeviceVo);

    /**
     * 根据条件统计报警数量，按日分组
     *
     * @param alarmDeviceVo 报警条件vo
     * @return 统计报警数量
     */
    List<Map<String, Object>> countAlarmByDayAndParamGlobal(AlarmDeviceVo alarmDeviceVo);

    List<BigScreenStatisticDTO> selectAlarmStatisticGlobal(@Param("start") Date start, @Param("end") Date end);

    List<MachineryWarnGroupTypeVO> countAlarmByWarnTypeGlobal(AlarmDeviceVo alarmDeviceVo);

    List<ProjectWarnStatsticsVO> countAlarmByProjectGlobal(AlarmDeviceVo alarmDeviceVo);

    //本月告警统计
    List<AlarmVo> find4ReportGlobal(@Param("tenantId") String tenantId, @Param("time") Date time);

    /**
     * 查询AI数据
     * @param tenantId
     * @param time
     * @param deviceTypeName
     * @return
     */
    List<AlarmVo> find4ReportAIGlobal(@Param("tenantId") String tenantId, @Param("time") Date time, @Param("deviceTypeName") String deviceTypeName);

    /**
     * 告警统计
     * @param tenantId
     * @param time
     * @param dCodes
     * @return
     */
    List<AlarmVo> find4CountReportGlobal(@Param("tenantId")String tenantId, @Param("time")Date time, @Param("deviceCodes") Set<String> dCodes);

    List<GzmAlarmVO> getGzmAlarmTypeStatistics(@Param("ruleIds") List<String> ruleEngineIds, @Param("tenantId") String tenantId);

    List<GzmAlarmDayVO> getAlarmTrendByTime(@Param("tenantId") String tenantId,
        @Param("ruleEngineId") String ruleEngineId, @Param("startTime") Date startTime,
        @Param("endTime") Date endTime);
}
